package it.unisa.unibox.Storage;

import it.unisa.unibox.beans.Prodotto;
import it.unisa.unibox.beans.Ricercatore;
import it.unisa.unibox.bridge.IValidazioneManager;
import it.unisa.unibox.commons.DBConnection;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class DBSupportoValidazione implements IValidazioneManager {

	private static DBSupportoValidazione dbsupportovalidazione;

	/**
	 * Singleton pattern, restituisce un'istanza dell'oggetto
	 * @return l'oggetto
	 */
	public static DBSupportoValidazione getInstance() {
		if (dbsupportovalidazione == null)
			dbsupportovalidazione = new DBSupportoValidazione();
		return dbsupportovalidazione;
	}

	/**
	 * RF_2.1 Visualizza i prodotti completi per un dato dipartimento
	 * @param idDip
	 * @return la lista di prodotti
	 */
	@Override
	public ArrayList<Prodotto> getProdottiCompleti(int idDip) throws SQLException {
		
		String query = "SELECT * FROM prodotto,ricercatore WHERE prodotto.responsabile=ricercatore.id and stato = '2' and ricercatore.dipartimento="+idDip;
		ResultSet rs = DBConnection.execQuery(query);
		ArrayList<Prodotto> list = new ArrayList<Prodotto>();
		int id;
		Ricercatore responsabile;
		String tipologia;
		String titolo;
		String abstract_field;
		int stato;
		int pubblico;
		int anno;
		String lingua;
		String url;
		String note;
		while (rs.next()) {
			id = rs.getInt("ID");
			int idRicercatore = rs.getInt("responsabile");
			responsabile = DBUtilityQuerys.getInstance().retrieveRicercatore(
					idRicercatore);
			tipologia = rs.getString("tipologia");
			titolo = rs.getString("titolo");
			abstract_field = rs.getString("abstract");
			stato = rs.getInt("stato");
			pubblico = rs.getInt("pubblico");
			anno = rs.getInt("anno");
			lingua = rs.getString("lingua");
			url = rs.getString("url");
			note = rs.getString("note");
			Prodotto p = new Prodotto(id, responsabile, tipologia, titolo,
					abstract_field, stato, pubblico, anno, lingua, url, note);
			list.add(p);
		}
		
		return list;
	}

	/**
	 * RF_2.3 Visualizza i prodotti accettati per una data area scientifica
	 * @param idArea
	 * @return la lista di prodotti
	 */
	@Override
	public ArrayList<Prodotto> getProdottiAccettati(int idArea) throws SQLException {
		
		String query = "SELECT * FROM prodotto,ricercatore WHERE prodotto.responsabile=ricercatore.id and stato = '3' and ricercatore.area_scientifica="+idArea;
		//System.out.println("query= " + query);
		ResultSet rs = DBConnection.execQuery(query);
		ArrayList<Prodotto> list = new ArrayList<Prodotto>();
		int id;
		Ricercatore responsabile;
		String tipologia;
		String titolo;
		String abstract_field;
		int stato;
		int pubblico;
		int anno;
		String lingua;
		String url;
		String note;
		while (rs.next()) {
			id = rs.getInt("ID");
			int idRicercatore = rs.getInt("responsabile");
			responsabile = DBUtilityQuerys.getInstance().retrieveRicercatore(
					idRicercatore);
			tipologia = rs.getString("tipologia");
			titolo = rs.getString("titolo");
			abstract_field = rs.getString("abstract");
			stato = rs.getInt("stato");
			pubblico = rs.getInt("pubblico");
			anno = rs.getInt("anno");
			lingua = rs.getString("lingua");
			url = rs.getString("url");
			note = rs.getString("note");
			Prodotto p = new Prodotto(id, responsabile, tipologia, titolo,
					abstract_field, stato, pubblico, anno, lingua, url, note);
			list.add(p);
		}
		
		return list;
	}

	/**
	 * RF_2.2,2.4 Imposta lo stato di validazione di un prodotto
	 * @param idProdotto
	 * @param nuovoStato
	 * @param note
	 * @return ture se l'operazione va a buon fine, false altrimenti
	 * @throws SQLException
	 * @throws IllegalArgumentException
	 */
	@Override
	public boolean setStatoValidazione(int idProdotto, int nuovoStato, String note)
			throws SQLException, IllegalArgumentException {
		// controlla che lo stato di arrivo sia nel range del processo di
		// validazione
		if (nuovoStato != 3 && nuovoStato != 4 && nuovoStato != 5)
			throw new IllegalArgumentException();
		
		String query = "UPDATE `db_unibox`.`prodotto` SET `stato`='"
				+ nuovoStato + "', `note`='"+note+"' WHERE `ID`='" + idProdotto + "';";
		int result = DBConnection.execUpdate(query);
		return (result == 1);
	}
}
